package Collections.shuffle;

import java.util.ArrayList;
import java.util.List;

/*
 * Collections.shuffle
 * Collections类中有一个算法 叫shuffle
 * shuffle 这个方法会将元素复制到数组中，然后打乱数组元素的排序，最后将打乱顺序后的元素副指挥列表
 * */
/*问题的关键:
为什么要用 List list = new ArrayList() ,而不用 ArrayList list = new ArrayList()呢？
问题就在于List接口有多个实现类，现在你用的是ArrayList，也许哪一天你需要换成其它的实现类，如
LinkedList或者Vector等等，这时你只要改变这一行就行了： List list = new LinkedList(); 其它使用了list地方的代码根
本不需要改动。
假设你开始用ArrayList alist = new ArrayList(), 这下你有的改了，特别是如果你使用了ArrayList实现类特有的方法和属性。
* */
public class ShuffleTest {
    public static void main(String[] args) {
        /*
        List是一个接口，而ArrayList是List接口的一个实现类。
        ArrayList类继承并实现了List接口。
         */
        var numbers = new ArrayList<Integer>();
        for (int i = 1; i <= 49; i++) {
            numbers.add(i);
        }
        java.util.Collections.shuffle(numbers);
        /*
        * 下面是个上溯 numbers是个ArrayList对象 上溯到List
        * */
        List<Integer> winningCombination = numbers.subList(0, 6);//为List接口创建一个指向自己的对象引用，而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用
        //这时winningCombination只能调用List的方法而不能调用ArrayList独有的方法
        System.out.println(winningCombination);
    }
}
